# -*- coding: utf-8 -*-
######
#
# agenda.py
# 
# Clase para manejar la base de datos. Utiliza activity como protocolo de intercambio de información. 
#
# Alejandra Josué 11496
# Benito Maza 11088
# Jorge Lainfiesta 11142
# 18/Abr/2011
#
######
from archivo import archivo
from activity import activity
from pyDes import *

class agenda:
   
   def __init__(self):
      pass
   
   #Método para comparar la contraseña y el usuario dados con datos en la base de datos.
   #  Devuelve True si es correcto, y False si no.
   def login(self, user, password):
      password = self.encrypt(password)
      usuarios = archivo("usuarios.txt")
      userRow = usuarios.find(user, 1)
      if userRow==None:
         return False
      else:
         if(userRow[0][2]==password):
            self.userID = userRow[0][0]
            return True
         else:
            return False


   #Método para insertar un usuario y su contraseña.
   #  Devuelve ints con significados distintos para manejar errores. 
   def registro(self, user, password):
      password = self.encrypt(password)
      usuarios = archivo("usuarios.txt")
      userRow = usuarios.find(user, 1)
      if(userRow!=None):
         return False
      else:
         curID = self.lastID(usuarios)
         newID=curID+1
         usuario = [newID, user, password]
         usuarios.write(usuario)
         return True
   
   #Recibe una activity y la agrega a la 'base de datos'
   def add(self, actividad):
      actividades = archivo("actividades.txt")
      aid = self.lastID(actividades)+1
      
      actividad.id = aid
      actividad.idu = self.userID
      
      actividades.write(actividad.toList())
   
   #Recibe una actividad
   #  Retorna una lista de actividades con el mismo valor en la columan col
   #  Default: col = 2; que es el nombre.
   def find(self, actividad, col=2):
      actividades = archivo("actividades.txt")
      actividad = actividad.toList()
      encontradas = actividades.find(actividad[col], col)
      if(encontradas!=None):
         print encontradas
      
         nuestras = []
         for acti in encontradas:
            if(acti[1]==self.userID):
               temp = activity()
               temp.fromList(acti)
               nuestras.append(temp)
         return nuestras
      else:
         return None
   
   #Recibe un int.
   #  Retorna el número cuantas de actividades por hacer.
   def show(self, cuantas):
      actividades = archivo("actividades.txt")
      nuestras = []
      for acti in actividades.content:
            if(acti[1]==self.userID):
               temp = activity()
               temp.fromList(acti)
               nuestras.append(temp)
      cont=1 #Cuenta si hubo intercambio de valores
      pasada=1  #cuenta cuantas pasadas debe de hacer
      while pasada<len(nuestras) and cont==1:  
            cont=0  
            for i in range(0,len(nuestras)-pasada):  
               if nuestras[i].date > nuestras[i+1].date:  
                  nuestras[i], nuestras[i+1] = nuestras[i+1], nuestras[i]  
                  cont=1  
            pasada += 1  
      return nuestras[:cuantas]
      
   #Recibe una activity, la borra de la base de datos.
   def delete(self, actividad):
      actid = int(actividad.id)
      actividades = archivo("actividades.txt")
      del actividades.content[actid-1]
      actividades.update()


   #Método para encriptar un string. Recibe un String y lo devuelve encriptado.
   def encrypt(self, password):
      k = des("DESCRYPT", CBC, "\0\0\0\0\0\0\0\0", pad=None, padmode=PAD_PKCS5)
      d = k.encrypt(password)
      return d
   
   #Retorna el último ID del archivo que recibe.
   def lastID(self, archi):
      last = archi.readLast()
      if(last!=None):
         last = int(last[0])
      else:
         last=0
      return last